Получение значений VID и PID usb накопителей

      В случае если необходимо установить драйвер к USB накопителю или выполнить программный ремонт, вам не обойтись без получения двух идентификаторов устройства:
  • VID – это Vendor Identifier (идентификатор производителя);
  • PID – это Product Identifier (идентификатор продукта, то есть конкретной модели устройства).
      Узнать VID и PID USB устройства вы можете через специальные утилиты, но можно обойтись и без них. Необходимо открыть «Диспетчер устройств» и найти раздел «Контроллеры универсальной последовательной шины USB» в Windows XP или «Контроллеры USB» в Windows Vista/7/8. Там вы можете найти свое USB устройство, VID и PID которого вы собираетесь определить. После выбора необходимого вам запоминающего устройства, сделайте клик правой клавишей мыши по нему и выберете из контекстного меню, пункт «Свойства».

      В появившемся окне свойств, перейдите на вкладку «Сведения» и выберете из выпадающего списка строку «Код экземпляра устройства» в Windows XP или «ИД оборудования» в Windows Vista/7/8.


      В поле «Значение», вам будет отображен VID и PID USB устройства, но важно учесть, что некоторые производители, экономя на регистрации собственных VID и PID, могут указать их произвольно!
      Рассмотрим программное получение этих значений с использованием Windows Management Instrumentation (WMI) и класса «Win32_USBHub».

Дополнительную информацию по данному классу вы можете получить по адресу http://msdn.microsoft.com/en-us/library/aa394506(v=vs.85).aspx.
      Если воспользоваться программой «WmiExplorer» и открыть класс «Win32_USBHub», то можно увидеть в столбце «PNPDeviceID» строку вида USB\VID_152D&PID_2509\00A123457D9C, которая имеет формат USB\VID_XXXX&PID_XXXX\Serial_number. Именно из этой строки мы и будем извлекать данные. Но данный класс возвращает список всех USB устройств подключенных к компьютеру, поэтому необходимо их отфильтровать.
      Посмотрите внимательно на представленный скриншот программы «WmiExplorer», вы увидите в колонке «Name» название устройства. Как и в диспетчере устройств, usb накопители представлены в виде «Запоминающее устройство для USB». Именно по этому значению будет сделан фильтр. Извлечение данных осуществляется через класс «ManagementObjectSearcher», путем указания запроса «Select», так как нам необходимо организовать фильтр «where», в запросе укажем условие поиска, вывести только устройства с именем «Запоминающее устройство для USB».
Дополнительную информацию по классу «ManagementObjectSearcher», вы можете получить по адресу http://msdn.microsoft.com/ru-ru/library/system.management.managementobjectsearcher(v=vs.110).aspx.
Функционал данного примера:
  • Получение VID usb накопителя;
  • Получение PID usb накопителя;
  • Получение серийного номера usb накопителя.
Создайте проект Windows Form в Microsoft Visual Studio и добавьте два компонента:
  • ListBox – вывод информации по usb устройствам;
  • Button – запуск процесса получения информации.
У вас получится приведенный ниже пример.
      Сделайте двойной клик левой клавишей мыши по компоненту «button1» и перейдите в автоматически созданный метод «button1_Click». Добавьте в него, приведенный ниже листинг.
string PNPDeviceID = string.Empty;

//Предварительно очищаем список
listBox1.Items.Clear();

//Получение списка USB накопителей
foreach (System.Management.ManagementObject drive in 
 new System.Management.ManagementObjectSearcher(
 "select * from Win32_USBHub where Caption='Запоминающее устройство для USB'").Get())
{
    PNPDeviceID = drive["PNPDeviceID"].ToString().Trim();
    //Получение Ven устройства
    listBox1.Items.Add("VID= " + 
     parseVidFromDeviceID(drive["PNPDeviceID"].ToString().Trim()).Trim());

    //Получение Prod устройства
    listBox1.Items.Add("PID= " + 
     parsePidFromDeviceID(drive["PNPDeviceID"].ToString().Trim()).Trim());

    //Получение Серийного номера устройства
    string[] splitDeviceId = drive["PNPDeviceID"].ToString().Trim().Split('\\');
    listBox1.Items.Add("Серийный номер= " + splitDeviceId[2].Trim());

    //Разделение списка устройств пустой строкой
    listBox1.Items.Add("");
}
Так же добавьте два метода расшифровки значений «PNPDeviceID».
private string parseVidFromDeviceID(string deviceId)
{
    string[] splitDeviceId = deviceId.Split('\\');
    string Prod;
    //Разбиваем строку на несколько частей. 
    //Каждая часть отделяется по символу &
    string[] splitProd = splitDeviceId[1].Split('&');

    Prod = splitProd[0].Replace("VID", ""); ;
    Prod = Prod.Replace("_", " ");
    return Prod;
}
private string parsePidFromDeviceID(string deviceId)
{
    string[] splitDeviceId = deviceId.Split('\\');
    string Prod;
    //Разбиваем строку на несколько частей. 
    //Каждая часть отделяется по символу &
    string[] splitProd = splitDeviceId[1].Split('&');

    Prod = splitProd[1].Replace("PID_", ""); ;
    Prod = Prod.Replace("_", " ");
    return Prod;
}
      Запустите ваш проект, нажав на клавиатуре, клавишу «F5». Вставьте Usb накопитель и нажмите кнопку «Получить информацию». Вы получите информацию о данном накопителе. Если устройств подключено несколько, то информация об устройствах будет разделена пустой строкой.
Внимание! Для карт памяти MMC, SD, MicroSD и прочих VID и PID определить нельзя, у них нет этих значений. Если даже попытаться их прочесть с помощью утилит, то виден будет VID и PID карт-ридера.

Ссылка для скачивания примера: Яндекс.Диск


Комментариев нет:

Отправить комментарий

Большая просьба, не писать в комментариях всякую ерунду не по теме!